Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: 마이리스트, 콜라보리스트 페이지 구현 #10

Merged
merged 33 commits into from
Feb 3, 2024

Conversation

ParkSohyunee
Copy link
Contributor

개요

  • 마이리스트 페이지, 콜라보리스트 페이지 구현

작업 사항

  • 사용자 프로필, 리스트, 아이템, 카테고리 mock data 생성하여 작업
  • 페이지 UI 구현
  • 플로팅 버튼 공통 component 제작
  • api 연결을 위한 React-Query 기본 설정 및 Axios Instance 생성

참고 사항 (optional)

  • vanilla-extract 동적 스타일링을 위해 @vanilla-extract/dynamic 라이브러리 설치
  • 리스트 목록 디자인을 구현하기 위해 @egjs/react-grid 라이브러리 선택
    • Masonry-grid Design을 제공하는 라이브러리
    • React-Masonry-Component 라이브러리와 고민했지만, 해당 라이브러리도 기능면에서 더 많은 옵션을 제공하여 선택
    • 추후 무한스크롤, 반응형 구현 시 이슈가 생긴다면 변경될 가능성 있음
  • 세부적인 디자인은 추후 UX 논의 후 수정될 가능성 있음

스크린샷

Feb-02-2024 00-45-54


리뷰어에게

  • 시간 나실 때 천천히 확인 부탁드립니다. 오늘도 파이팅!! 🔥
  • 코드 리뷰, 피드백 언제나 환영입니다. ❤️‍🔥

Copy link
Contributor

@Nahyun-Kang Nahyun-Kang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오매낫 husky 때문에 충돌이..🥲
소현님 항상 느끼는 것 같지만 코드 진짜 깔끔하게 잘 쓰시는 것 같습니당!! 👍
LGTM!

@@ -0,0 +1,56 @@
'use client';

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

머지되면 바로 floating 버튼 줍줍 예정입니다 ><

return (
<div
className={styles.arrowUpButton}
onClick={handleScrollToTop}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assignInlinVars를 요렇게 쓰는 것이었군요..🫢 배워갑니당!!

Copy link
Contributor

@seoyoung-min seoyoung-min left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

진짜 소현님... 이번 코드리뷰 시간 저의 학습시간이었습니다!
진짜 코드 너무 깔끔해서 쫙쫙 읽히고,
꼼꼼하고 간결한 코드가 너무 좋습니다🥹👍

Comment on lines +23 to +25
style={assignInlineVars({
[styles.imageUrl]: `url(${user.backgroundImageUrl})`,
})}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dynamic 스타일링 이렇게 하는 거군요...!
덕분에 훨씬 쉽게 이해할 수 있었어요! 감사합니다🙇‍♀️

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 저도 감사합니다!!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 바닐라익스트랙 다이나믹을 아직 잘 모르지만,
소현님께서 다른 곳 다이나믹 스타일링 적용하실때에는

className={`${styles.button} ${kind.korNameValue === selected ? styles.variant : ''}`}

이런식으로 적용해주셨던 것 같아서,
여기서는 assignInlineVars을 사용해야하셨던 이유가 있으신지 궁금해요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 유진님~! assignInlineVars를 적용한 부분은 리스폰스로 데이터를 받아서 스타일 값으로 적용해야 할 때 사용하였습니다. (배경 백그라운드 및 리스트 배경 컬러) 반면에 기존 스타일에서 조건에 따른 스타일을 추가로 적용해야 할때는 className에 변화를 주는 방법을 사용했습니다~! (+. 이 부분도 바닐라익스트랙에 Sprinkles를 이용하고 싶었는데 어려웠습니다🥹)

</div>
<div className={styles.profileContainer}>
<div className={styles.profile}>
<img src={user.profileImageUrl} className={styles.avatar} alt="아바타" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 태그 대신 태그 쓰신 이유가 있을까요??

저번에 소현님 덕분에 svg는 최적화가 어려워 img 태그 쓰는 것을 배웠는데,
프로필 이미지는 svg가 아닐 것 같아서요!! 궁금합니다 👀

  1. alt 텍스트 '아바타' 대신에 '프로필 이미지'는 어떨까요??

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

next/Image가 아닌 img 태그를 쓰신 이유 저도 궁금합니다!
혹시 이유가 있으셨나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

특별한 이유는 없고, next/Image 사용을 깜빡했습니다 ㅎㅎ 확인 해 주셔서 감사합니다.🥹
해당 프로필은 next/Image 컴포넌트를 사용하는 것으로 수정하겠습니다~! (+. alt도 함께 수정)

Comment on lines +37 to +42
<Link href={`/${user.nickname}/mylist`} className={styles.link}>
<button className={`${styles.leftButton} ${type === 'my' ? styles.variant : ''}`}>마이 리스트</button>
</Link>
<Link href={`/${user.nickname}/collabolist`} className={styles.link}>
<button className={`${styles.rightButton} ${type === 'collabo' ? styles.variant : ''}`}>콜라보 리스트</button>
</Link>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

옵셔널한 경우에는 이렇게 클래스명 2개 사용해서 스타일링을 할 수 있겠군요...
배워갑니다!! (제 코드 수정하러 갑니다🏃‍♀️)

Comment on lines 36 to 42
useEffect(() => {
window.addEventListener('scroll', visibleButton);

return () => {
window.removeEventListener('scroll', visibleButton);
};
}, []);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추후 탐색페이지에서는 스크롤 이벤트가 많이 발생하다보니,
성능 개선을 위해 쓰로틀링을 추가해도 좋을 것 같다는 생각이 듭니다!
소현님 의견은 어떠실까요??

현재 마이페이지 기준 테스트를 해보니, 12-13회 정도 발생했던 것이 4회정도로 줄어드는 것 같습니다.(쓰로틀링 0.3초로 설정시)

  1. (제가 아는 방식은) lodash 라이브러리 설치
yarn add lodash
yarn add --dev @types/lodash
  1. 적용
import throttle from 'lodash/throttle';
//...
window.addEventListener('scroll', throttle(visibleButton, 300));

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쓰로틀링이 이럴 때 쓰이는 거였군요! 👍👍 서영님 덕분에 배워갑니다 ㅎㅎ

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@seoyoung-min
서영님 피드백 바탕으로 쓰로틀링을 커스텀 훅으로 구현해서 수정해 보았는데 시간 나실때 확인 한번 부탁드려도 될까요?! 🥹

Comment on lines 45 to 54
<div
className={styles.arrowUpButton}
onClick={handleScrollToTop}
style={assignInlineVars({
[styles.opacitySize]: isVisible ? '1' : '0',
[styles.cursor]: isVisible ? 'pointer' : 'default',
})}
>
<ArrowUpIcon alt="상단으로 이동하기 버튼" className={styles.icon} />
</div>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아침 데일리스크럼 때 제안드린 부분 구현 방식을 고민해봤습니다!

Suggested change
<div
className={styles.arrowUpButton}
onClick={handleScrollToTop}
style={assignInlineVars({
[styles.opacitySize]: isVisible ? '1' : '0',
[styles.cursor]: isVisible ? 'pointer' : 'default',
})}
>
<ArrowUpIcon alt="상단으로 이동하기 버튼" className={styles.icon} />
</div>
//아예 없애고 노출시키는 방향
<>
{isVisible && (
<div className={styles.arrowUpButton} onClick={handleScrollToTop}>
<ArrowUpIcon alt="상단으로 이동하기 버튼" className={styles.icon} />
</div>
)}
</>
//CSS는 transition 대신 애니메이션으로
    const fadeIn = keyframes({
    '0%': { opacity: 0 },
    '100%': { opacity: 1 },
    });

    export const arrowUpButton = style([
    addButton,
    {
        animation: `${fadeIn} 300ms ease`,
    },
    ]);

@ParkSohyunee
Copy link
Contributor Author

오매낫 husky 때문에 충돌이..🥲 소현님 항상 느끼는 것 같지만 코드 진짜 깔끔하게 잘 쓰시는 것 같습니당!! 👍 LGTM!

@Nahyun-Kang
나현님, 시간 내서 피드백 해주셔서 감사드립니다. 😊

@ParkSohyunee
Copy link
Contributor Author

진짜 소현님... 이번 코드리뷰 시간 저의 학습시간이었습니다! 진짜 코드 너무 깔끔해서 쫙쫙 읽히고, 꼼꼼하고 간결한 코드가 너무 좋습니다🥹👍

@seoyoung-min
서영님 시간 내서 꼼꼼하게 피드백 해주셔서 감사드립니다. 코드까지 첨부해주셔서 넘 감동이네요..😍🥹
리뷰 주신 내용 확인해서 오늘~내일 중으로 수정 반영 해놓겠습니다. 의견 감사합니당👍

Copy link
Contributor

@kanglocal kanglocal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넘 고생많으셨습니다 감사합니다!! 👍

next.config.js Outdated
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와앙 웹팩 설정 해보다가 안되서 포기했는데 좋은 예시 주셔서 감사합니다! 👍

Comment on lines +23 to +25
style={assignInlineVars({
[styles.imageUrl]: `url(${user.backgroundImageUrl})`,
})}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 바닐라익스트랙 다이나믹을 아직 잘 모르지만,
소현님께서 다른 곳 다이나믹 스타일링 적용하실때에는

className={`${styles.button} ${kind.korNameValue === selected ? styles.variant : ''}`}

이런식으로 적용해주셨던 것 같아서,
여기서는 assignInlineVars을 사용해야하셨던 이유가 있으신지 궁금해요!

@seoyoung-min
Copy link
Contributor

소현님 수정해주신 부분도 확인했습니다!! 직접 쓰로틀 커스텀 훅 구현까지...👍
Image 컴포넌트 host 설정해주는 것도 처음 알았습니다!! 감사합니다🙇‍♀️👍

@ParkSohyunee ParkSohyunee merged commit 6a517f1 into 8-Sprinters:dev Feb 3, 2024
1 check passed
@ParkSohyunee ParkSohyunee deleted the feature/feed branch August 3, 2024 02:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Design UI 수정 Feat 구현
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants